#include "cabecera.h"
#include <stdlib.h>
#include <stdio.h>

/**
	@file cabecera.c
	@brief Cabecera ejercicio 4
	@author Ivan Portillo Leal
	@date Hoy
*/


/**
	@fn reservarMemoria(int nFil, int nCol)
	@brief Reserva memoria para una matriz de nFil y nCol
	@param nFil Numero de filas (ENTERO)
	@param nCol Numero de columnas (ENTERO)

	@result Puntero entero a matriz reservada en memoria

	@author Ivan Portillo Leal
	@date Hoy

	Reserva de memoria para una matriz de nFil y nCol
*/
int** reservarMemoria(int nFil, int nCol){
	int i;
	int** aux = (int**) malloc(nFil*sizeof(int*));
	for(i=0 ; i<nFil; i++){
		*(aux+i) = (int*) malloc(nCol*sizeof(int));
	}
	return aux;
}

/**
	@fn rellenaMatriz(int** matriz, int nFil, int nCol)
	@brief Introducir los valores en una matriz (Cada elemento es la suma del numero de fila y de columna)
	@param matriz Matriz que se desea rellenar (PUNTERO DOBLE A ENTERO)
	@param nFil Numero de filas de la matriz (ENTERO)
	@param nCol Numero de columnas de la matriz (ENTERO)

	@result VOID

	@author Ivan Portillo Leal
	@date Hoy

*/
void rellenaMatriz(int** matriz, int nFil, int nCol){
	int i,j;
	for(i=0 ; i<nFil ; i++){
		for(j=0 ; j<nCol ; j++){
			*(*(matriz+i)+j) = i+j;
		}
	}
}

/**
	@fn imprimeMatriz(int** matriz, int nFil, int nCol)
	@brief Imprime por pantalla la matriz que se le pasa como parámetro
	@param matriz Matriz que se desea imprimir (PUNTERO DOBLE A ENTERO)
	@param nFil Numero de filas de la matriz (ENTERO)
	@param nCol Numero de columnas de la matriz (ENTERO)

	@result VOID

	@author Ivan Portillo Leal
	@date HOY
*/
void imprimeMatriz(int** matriz, int nFil, int nCol){
	int i,j;
	for(i=0 ; i<nFil ; i++){
		printf("[%d]   ",i+1);
		for(j=0 ; j<nCol ; j++){
			printf(" %d", *(*(matriz+i)+j));
		}
		printf("\n");
	}
}

void liberarMemoria(int*** matriz, int nFil){
	int i;
	for(i=0; i<nFil; i++){
		free(*(*matriz+i));
	}
	free(*matriz);
	(*matriz) = NULL;
}

int** eliminarFila(int** matriz, int nFil, int nCol, int fila_borrada){
	int i,j,k=0,l=0;
	int** aux = reservarMemoria(nFil,nCol);
	for(i=0 ; i<nFil ; i++){
		if(i != fila_borrada) {
			for(j=0 ; j<nCol ; j++){
				aux[k][l] = *(*(matriz+i)+j);
				l++;
			}
			k++;
		}
		l=0;

	}
	liberarMemoria(&matriz,nFil);
	aux = (int**) realloc(aux,nFil*sizeof(int*));
	return aux;
}

